前一天熱身完畢,今天的內容比較豐富了。邊看也邊補充一些基本知識。
來看第二條準則:
Prefer "const", "enum", and "inline" to "#define"
這個說法其實是背後的意思是: prefer compiler> preprocessor。
簡單來說:
前置處理器比編譯器還更前面,先處理過才會再給編譯器,#define這些macro的內容就是在經過前置處理器轉換過後被代換掉,才會傳遞給前置處理器。
#define像是不在該語言本身,編譯器根本不知道這些macro的內容,所以編譯器報錯的時候顯示的會是轉換過後的內容,會造成難以debug。解決辦法就是用const來取代macro,因為編譯器看得到const的內容,他是有被存到symbol table裡面的。
在用const來取代#define的時候有兩個注意事項:
const char * const authorName = "Scott Meyers";
(關於const+pointer的使用下一個準則還會再提到),那此時不如這樣寫:
const std::string authorName("Scott Meyers");
class GamePlayer
{
private:
static const int NumTurns = 5;
}
這邊對於NumTurns的用法是"宣告"而非"定義",有些比較早期的編譯器不接受在宣告的時候定義初始值,另外這種用法也只能用在整數常數,如果不是以上情形,就需要改在定義的地方指定值。(就是把他們拆開)
class GamePlayer
{
private:
static const int NumTurn;
}
const int GamePlayer::NumTurn = 5; // in implementation file
另外跟class有掛勾的const更永遠不應該被用#define的用法,因為#define沒辦法指定範圍,沒辦法被封裝。
今天邊看邊補充的內容多了一點,明日繼續。
(皆取自參考資料)